<?php
declare (strict_types = 1);

namespace app\admin\controller;

use think\exception\ValidateException;
use think\facade\Cache;
use think\facade\Cookie;
use think\facade\Session;
use think\facade\View;
use think\Request;

class Login
{
    /**
     * 展示登录页面
     */
    public function login(){

        # 临时关闭模版布局
        View::config(['layout_on' => false]);
        return View::fetch();
    }

    /**
     * 登录验证
     * 登录接口
     */
    public function doLogin(Request $request){
//        echo md5('123456');die();// 重置数据库加密方式

        try {

            # 验证表单令牌是否正确
            $check = $request->checkToken('__token__');

            if(false === $check) {
                return json(['code' => 2001,'msg' => '表单令牌不正确','data' => []]);//响应的数据格式
            }
            # 代码体
            # 接值
            $username = $request->post('username');
            $password = $request->post('password');
            # 参数验证
            validate(\app\admin\validate\Login::class)->check(
                [
                    'username' => $username,
                    'password' => $password
                ]
            );

            // 第二方法验证验证码
//            $captcha = $request->post('captcha');
//            if(!captcha_check($captcha)){
//                // 验证失败
//                return json(['code' => 2003,'msg' => '验证码不正确','data' => []]);//响应的数据格式
//            };

            # 查询数据库
            $manager = \app\admin\model\Manager::where('username',$username)->find();
            if (empty($manager)) {
                return json(['code' => 2001,'msg' => '用户名不存在','data' => []]);//响应的数据格式
            }

            if ($manager->password != md5($password)) {
                return json(['code' => 2002,'msg' => '密码不正确','data' => []]);//响应的数据格式
            }

            # 登录成功之后
            # 查询当前登录用户的一个权限
            # 角色id
            $role_id = $manager->role_id;
            # 根据模型查询一条数据 根据角色id查询角色信息
            $roleInfo = \app\admin\model\Role::find($role_id);
            # 权限id
            $auth_ids = $roleInfo->role_auth_ids;

            # 根据权限id、查询对应的权限信息
            $authInfo = \app\admin\model\Auth::whereIn('id',$auth_ids)->select()->toArray();

            # 获取一级菜单 、处理权限信息、方便客户端循环展示
            $oneAuth = [];
            foreach ($authInfo as $value) {
                if ($value['pid'] == 0) {
                    $oneAuth[] = $value;
                }
            }
            // 将我们二级权限、放进一级权限里面
            foreach ($oneAuth as $key => $value) {
                # 循环所有的权限
                foreach ($authInfo as $item) {
                    if ($item['pid'] == $value['id']) {
//                        $value['children'][] = $item;// 仅仅只改变了$value 、没有改变$oneAuth数组的值
                        $oneAuth[$key]['children'][] = $item;// 改变$oneAuth数组的值
                    }
                }
            }

            # 将当前登录用户的权限 存储到缓存
            $auth_key = 'managerAuth'.$manager->id;
            Cache::set($auth_key,$oneAuth);

            # 保存用户的信息 username\id
            Session::set('managerInfo',['username' => $manager->username,'id' => $manager->id]);

            # 更新最后一次的登录
            $manager->last_login_time = time();
            $manager->save();


            # 简单用法
//            Session::set('username',$manager->username);
            return json(['code' => 200,'msg' => 'ok','data' => []]);//响应的数据格式
        }catch (ValidateException $validateException) {
            # 获取错误信息
            return json(['code' => 2003,'msg' => $validateException->getError(),'data' => []]);//响应的数据格式
//            dd($validateException->getError());
        }

    }

    /**
     * 退出功能
     */
    public function logout(){
        # 删除会话控制中用户信息
        Session::delete('managerInfo');
        return redirect('/admin/login');
    }

    /**
     * 会话控制技术
     */
    public function topic(){

        // 存储cookie
//        Cookie::set('username','zhangsan',120);
        //获取cookie
//        echo Cookie::get('username');
            // 存储session
//        Session::set('name','list');

        // 获取session
//        return Session::get('name');

        //删除session的值
//        Session::delete('name');
//        // 判断session的知、是否存在
//        $res =  Session::has('name');
//        var_dump($res);
    }
}
